package cal;

import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @author Michael Weng
 * 
 *         Klassen die Daten zur Erstellung der Kalenderansichten liefern.
 * 
 */

public class MonthData {

	/**
	 * Sucht den ersten Wochentag des Monats in dem das Datum liegt. 1 = Montag,
	 * 2 = Dienstag... 7 = Sonntag
	 * 
	 * @param d
	 *            Datum zu dem der Monat gesucht werden soll
	 * @return ersten Wochentag des Monats
	 */
	public static int firstDay(Date d) {

		@SuppressWarnings("deprecation")
		int m = d.getMonth();
		@SuppressWarnings("deprecation")
		int j = d.getYear();

		@SuppressWarnings("deprecation")
		Date e = new Date(j, m, 1);
		@SuppressWarnings("deprecation")
		int f = e.getDay();
		// Eigendlich ist der Sontag 0. Wir machen ihn zur 7.
		if (f == 0)
			f = 7;
		return f;
	}

	/**
	 * Ermittelt Länge des Monats
	 * 
	 * @param d
	 *            Datum zu dem die Länge des Monat gesucht werden soll
	 * @return Länge des Monats als Integer
	 */
	@SuppressWarnings("deprecation")
	public static int monthLength(Date d) {

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, d.getYear());
		cal.set(Calendar.MONTH, d.getMonth());
		cal.set(Calendar.DATE, d.getDate());

		return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * Ermittelt die Laenge des vorrigen Monats.
	 * 
	 * @param d
	 *            Datum zu welchem die Länge des Vormonats errechnet wird
	 * @return Länge des Vormonats als Integer
	 */
	@SuppressWarnings("deprecation")
	public static int lastMonthLength(Date d) {

		int m = d.getMonth();
		int j = d.getYear();

		if (m == 0) {
			m = 11;
			j = j - 1;
		} else {
			m--;
		}
		Date e = new Date(j, m, 1);

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, e.getYear());
		cal.set(Calendar.MONTH, e.getMonth());
		cal.set(Calendar.DATE, e.getDate());

		return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * Gibt ein bool Array mit 42 Feldern aus, die angeben ob das Feld zum Monat
	 * gehört.
	 * 
	 * @param d
	 *            Datum zu welchem das Bool Array erstellt wird
	 * @return Bool Array mit 42 Feldern
	 */

	public static Boolean[] getBoolArray(Date d) {

		Boolean[] boolArray = new Boolean[42];
		int firstDay = firstDay(d);
		int monatsLaenge = monthLength(d);

		for (int i = 0; i < 42; i++) {

			if (i < firstDay - 1) {
				boolArray[i] = false;
			} else if (i > firstDay + monatsLaenge - 2) {
				boolArray[i] = false;
			} else
				boolArray[i] = true;

		}
		return boolArray;
	}

	/**
	 * Gibt ein int Array mit 42 Feldern und den jeweiligen Tagen aus.
	 * 
	 * @param d
	 *            Datum zu welchem das Array errechnet wird
	 * @return Array welches die Tageszahlen enthält
	 */

	public static int[] getIntArray(Date d) {

		int monatsLaenge = monthLength(d);
		int firstDay = firstDay(d);
		int vorMonatsLaenge = lastMonthLength(d);

		int freieTageVorne = firstDay - 1;
		@SuppressWarnings("unused")
		int freieTageHinten = 42 - freieTageVorne + monatsLaenge;

		int[] kalenderArray = new int[42];

		int x = 1;
		int y = 1;

		int z = vorMonatsLaenge + 1;
		for (int i = freieTageVorne; i >= 0; i--) {
			kalenderArray[i] = z;
			z--;
		}

		for (int i = 0; i < 42; i++) {

			// belegt Felder vom Vormonat

			if (i + 1 <= freieTageVorne) {

			}

			// belegt Felder nach Monat

			else if (i + 1 > freieTageVorne + monatsLaenge) {
				kalenderArray[i] = y;
				y++;
			}

			// belegt Felder vom Monat
			else {
				kalenderArray[i] = x;
				x++;
			}

		}

		return kalenderArray;
	}

	/**
	 * * Gibt ein Date Array mit 42 Feldern aus, in denen Dates liegen.
	 * 
	 * @param d
	 *            Datum zu welchem der Monat errechnet wird
	 * @return Array welches die Datums enthält
	 */

	@SuppressWarnings("deprecation")
	public static Date[] getDateArray(Date d) {

		int monatsLaenge = monthLength(d);
		int firstDay = firstDay(d);
		int vorMonatsLaenge = lastMonthLength(d);
		int freieTageVorne = firstDay - 1;
		@SuppressWarnings("unused")
		int freieTageHinten = 42 - freieTageVorne + monatsLaenge;

		Date[] kalenderArray = new Date[42];

		// setzt die Felder des Vormonats

		int j = d.getYear();
		int m = d.getMonth();
		@SuppressWarnings("unused")
		int t = 1;
		int y = 1;
		int x = 1;

		// Monat und Jahr des vorigen Monats.
		int vm;
		int vj;

		// Ueberprueft ob Januar ist.
		if (m == 0) {

			vm = 11;
			vj = j - 1;

		} else {
			vm = m - 1;
			vj = j;
		}

		// Monat und Jahr des folgenden Monats.
		int nm;
		int nj;

		// Ueberprueft ob Dezember ist.

		if (m == 11) {

			nm = 0;
			nj = j + 1;

		} else {
			nm = m + 1;
			nj = j;
		}

		// Setzt die Dates des Vormonats

		int z = vorMonatsLaenge + 1;
		for (int i = freieTageVorne; i >= 0; i--) {
			kalenderArray[i] = new Date(vj, vm, z);
			z--;
		}

		// Setzt die Dates des aktuellen Monats

		for (int i = 0; i < 42; i++) {

			// Felder vom Vormonat

			if (i + 1 <= freieTageVorne) {

			}

			// belegt Felder nach Monat

			else if (i + 1 > freieTageVorne + monatsLaenge) {
				kalenderArray[i] = new Date(nj, nm, y);
				y++;
			}

			// belegt Felder vom Monat
			else {
				kalenderArray[i] = new Date(j, m, x);
				x++;
			}

		}
		return kalenderArray;

	}

}
